`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    14:25:40 09/12/2012 
// Design Name: 
// Module Name:    Fms 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module Fms(clk_i,reset_i,expired,resultadoComparacion,senalComparacion,posicionRegistro,busdatos_i,busdatos_o,busleds,oe_o,wr_o,cs_o
);
	input reset_i,expired,clk_i;	
	input resultadoComparacion;
	input [3:0] busdatos_i;	
	output [3:0] busdatos_o;
	output senalComparacion,oe_o,wr_o,cs_o;
	output [3:0] busleds,posicionRegistro;
	reg [3:0] busleds;
	reg [3:0] posicionRegistro;
	reg senalComparacion,cs_o,wr_o,oe_o;
	reg [3:0] busdatos_o;
	initial begin		 
		busleds=4'b1111;
		posicionRegistro=0;
		senalComparacion=0;
		busdatos_o=0;
		oe_o=0;
		wr_o=0;
		cs_o=1;
	end
	parameter state0  = 3'b000;	
   parameter state1  = 3'b001;
   parameter state2  = 3'b010;
   parameter state3  = 3'b011;
   parameter state4  = 3'b100;
   parameter state5  = 3'b101;


   reg [2:0] state = state0;

   always@(posedge clk_i)	// maquina de estados
		begin
         case (state)
				state0 : begin	
					if (reset_i) 
						begin
							oe_o<=1;
							wr_o<=0;
							cs_o<=0;
							busleds<=4'b1111;
							posicionRegistro<=0;
							senalComparacion<=0;							
							state <= state1;
						end
					else
						begin
							state <= state0;
						end
				end
            state1 : begin				
					busleds <= 4'b0111;
					busdatos_o<=busdatos_i;
               if (expired) begin
                  state <= state2;
						wr_o<=1;
						cs_o<=0;
						end
					else
                  state <= state1;
            end
            state2 : begin
					busleds<=4'b1111;
					if(expired)
					begin
						if (posicionRegistro+1<16)
						begin
							wr_o<=0;
							cs_o<=0;
							posicionRegistro<=posicionRegistro+1;
							state <= state1;
						end      
						else
							begin
								cs_o<=0;
								wr_o<=1;
								oe_o<=0;
								state <= state3;
								posicionRegistro<=0;
							end
						end
						else
							begin
								state<=state2;
							end
						
				end
            state3 : begin				
					busleds <= 4'b1011;
					senalComparacion<=1;
               if (expired) begin 
						cs_o<=0;
                  state <= state4;
						end
					else
                  state <= state3;
				end
            state4 : begin	
					if(resultadoComparacion)
						state <= state5;
					else if (!resultadoComparacion) begin
						busleds <= 4'b1101;
						state <= state0;
					end
					else
						state <= state4;
				end
            state5 : begin	
				   busleds<=4'b1111;
					senalComparacion<=0;
					if(expired)
						begin
						if (posicionRegistro+1<16)
						begin
							cs_o<=0;
							posicionRegistro<=posicionRegistro+1;
							state <= state3;
						end      
						else
							begin
								busleds <= 4'b1110;						
								state <= state0;
								posicionRegistro<=0;
							end
						end
					else
					begin
						state<=state5;
					end
				end
		endcase
		end
endmodule

